<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 使用 get 函数可避免长链的 key 时获取不到属性而出现问题，此时进行异常避免时及其服务，如 o.a && o.a.b && o.a.b.c && o.a.b.c.d

        //     实现类似lodash.get，有以下测试用例:

        //     const object = { a: [{ b: { c: 3 } }] };

        //     //=> 3
        //     get(object, "a[0].b.c");

        //     //=> 3
        //     get(object, 'a[0]["b"]["c"]');

        //     //=> 10086
        //     get(object, "a[100].b.c", 10086);

        function get(obj, path, defaultValue) {
            const keys = [];
            let currentKey = '';
            let insideBrackets = false;

            // 手动解析路径字符串  
            for (let i = 0; i < path.length; i++) {
                const char = path[i];

                if (char === '[') {
                    insideBrackets = true;  // 开始方括号  
                    if (currentKey) {
                        keys.push(currentKey); // 添加当前键  
                        currentKey = ''; // 重置  
                    }
                } else if (char === ']') {
                    insideBrackets = false; // 结束方括号  
                    if (currentKey) {
                        keys.push(currentKey); // 添加当前键（数字）  
                        currentKey = ''; // 重置  
                    }
                } else if (char === '.') {
                    // 添加键并重置当前键  
                    if (currentKey) {
                        keys.push(currentKey);
                        currentKey = '';
                    }
                } else {
                    // 拼接键  
                    currentKey += char;
                }
            }

            // 添加最后的键（如果有）  
            if (currentKey) {
                keys.push(currentKey);
            }

            // 遍历获取值  
            let result = obj;
            for (const key of keys) {
                if (result !== null && typeof result === 'object' && key in result) {
                    result = result[key];  // 深入下一层  
                } else {
                    return defaultValue; // 返回默认值  
                }
            }

            // 返回找到的值或默认值  
            return result === undefined ? defaultValue : result;
        }

        // 测试用例  
        const object = { a: [{ b: { c: 3 } }] };

        console.log(get(object, "a[0].b.c")); // => 3  
        console.log(get(object, 'a[0]["b"]["c"]')); // => 3  
        console.log(get(object, "a[100].b.c", 10086)); // => 10086  

    </script>
</body>

</html>